using System;
using Microsoft.Practices.Prism.Events;
using Microsoft.Practices.Prism.ViewModel;
using Microsoft.Practices.Unity;
using Ausy.Silverlight.VideoPlayer.Infrastructure.Common;
using System.Windows.Input;
using Microsoft.Practices.Prism.Commands;

namespace Ausy.Silverlight.VideoPlayer.MediaModule.ViewParts
{
    /// <summary>
    /// Cette classe représente le Vue Model pour le Screencast
    /// </summary>
    public class ScreencastViewModel : ViewModel<IScreencastView>, IScreencastViewModel
    {
        #region Private Members

        /// <summary>
        /// Container Unity pour instanciation des type d'objet
        /// </summary>
        protected readonly IUnityContainer container;

        /// <summary>
        /// Gestionnaire d'Evènement
        /// </summary>
        protected readonly IEventAggregator eventAggregator;

        #endregion

        #region public ScreencastEnded Event

        /// <summary>
        /// Evènement lorsque la lecture est terminée
        /// </summary>
        public event EventHandler<EventArgs> ScreencastEnded;

        /// <summary>
        /// Evènement lorsque la lecture est terminée
        /// </summary>
        private void OnScreencastEnded(EventArgs e)
        {
            EventHandler<EventArgs> handler = ScreencastEnded;

            if (handler != null)
            {
                handler(this, e);
            }
        }

        #endregion

        #region FileName Property

        /// <summary>
        /// Property fileName
        /// </summary>
        private Uri fileName;

        /// <summary>
        /// Property FileName
        /// </summary>
        public Uri FileName
        {
            get { return fileName; }
            set
            {
                if (fileName != value)
                {
                    fileName = value;
                    RaisePropertyChanged(() => this.FileName);
                }
            }
        }

        #endregion

        #region MediaEndedCommand Command Property
        
        /// <summary>
        /// Commande de gestion de fin de lecture de média
        /// </summary>
        public ICommand MediaEndedCommand { get; set; } 

        #endregion
        
        #region IsPlaying Property

        /// <summary>
        /// Property isPlaying
        /// </summary>
        private bool isPlaying;

        /// <summary>
        /// Property IsPlaying
        /// </summary>
        public bool IsPlaying
        {
            get { return isPlaying; }
            set
            {
                if (isPlaying != value)
                {
                    isPlaying = value;
                    RaisePropertyChanged(() => this.IsPlaying);
                }
            }
        }

        #endregion

        
        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        /// <param name="container">Container Unity pour instanciation des type d'objet</param>
        public ScreencastViewModel(IUnityContainer container)
            : base(container)
        {

        }

        #endregion

        #region Initialize Method

        /// <summary>
        /// Cette méthode permet l'initialisation du ViewModel avant que le DataContext soit affecté à la vue
        /// </summary>
        protected override void Initialize()
        {
            // Initialisation des données

            // Initialisation des commandes
            this.MediaEndedCommand = new DelegateCommand<string>(s =>
            {
                this.OnScreencastEnded(null);
            });
        }

        #endregion
    }
}
